#include "tree.h"


// 初始化二叉树
int init_binary_tree(Tree_Node ** root)
{
    *root = (Tree_Node *)malloc(sizeof(Tree_Node));
    if (NULL == *root)
    {
        ERRLOG("动态空间创建失败");
        exit(EOF);
    }
    memset(&(*root)->data,0,sizeof(Elenemt_data));
    (*root)->lchilb = NULL;
    (*root)->rchilb = NULL;
    return 0;
}


// 插入节点
void insert_node(Tree_Node ** root, Elenemt_data data)
{
    if (NULL == (*root))
    {
        //创建节点
        Tree_Node *new_node = (Tree_Node *)malloc(sizeof(Tree_Node));
        if (NULL == new_node)
        {
            ERRLOG("动态空间创建失败");
            return;
        }
        // 写入数据
        new_node->data = data;
        new_node->lchilb = NULL;
        new_node->rchilb = NULL;

        printf("%s插入成功\n", data.name);
        //连接root和new_node
        (*root) = new_node;
        return;
    }
    if (data.id < (*root)->data.id)
    {
        // 左孩子
        insert_node(&(*root)->lchilb, data);
    }
    else
    {
        // 右孩子
        insert_node(&(*root)->rchilb, data);
    }
    return;
}

// 先序遍历 根 左 右   preorder_traversal
void pre_rder(Tree_Node *root)
{
    if (NULL != root)
    {
        //打印
        printf("%s\t%s\t%d\t%d\t%d\n",
               root->data.name, root->data.sex, root->data.age,
               root->data.id, root->data.sco);
        //左
        pre_rder(root->lchilb);
        //右
        pre_rder(root->rchilb);
    }
    
}

// 中序遍历 左 根 右    inorder_traversal
void ino_rder(Tree_Node *root)
{
    if (NULL != root)
    {
        //左
        ino_rder(root->lchilb);
        //打印
        printf("%s\t%s\t%d\t%d\t%d\n",
               root->data.name, root->data.sex, root->data.age,
               root->data.id, root->data.sco);
        //右
        ino_rder(root->rchilb);
    }
    
}

// 后序遍历 左 右 根   postorder_traversal
void pos_rder(Tree_Node *root)
{
    if (NULL != root)
    {
        //左
        pos_rder(root->lchilb);
        //右
        pos_rder(root->rchilb);
        //打印
        printf("%s\t%s\t%d\t%d\t%d\n",
               root->data.name, root->data.sex, root->data.age,
               root->data.id, root->data.sco);
    }
    
}

// 释放 左 右 根
void free_tree(Tree_Node ** root)
{
    if (NULL != *root)
    {
        //释放左
        free_tree(&(*root)->lchilb);
        //释放右
        free_tree(&(*root)->rchilb);
        //释放根
        printf("%s释放成功\n", (*root)->data.name);
        free(*root);
        *root = NULL;
    }
    
}